home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
ab20
/
ab20_archive
/
utilities
/
printer
/
pf_deskjet.lzh
/
PF
/
Source
/
wb.c
< prev
Wrap
C/C++ Source or Header
|
1991-09-27
|
10KB
|
418 lines
/*---------------------------------------------------------*
| Author: Maurizio Loreti, aka MLO or I3NOO. |
| Address: University of Padova - Department of Physics |
| Via F. Marzolo, 8 - 35131 PADOVA - Italy |
| Phone: (39)(49) 844-313 FAX: (39)(49) 844-245 |
| E-Mail: LORETI at IPDINFN (BITNET); or VAXFPD::LORETI |
| (DECnet) - VAXFPD is node 38.257 i.e. 39169; or |
| LORETI@PADOVA.INFN.IT (INTERNET). |
| Home: Via G. Donizetti 6 - 35010 CADONEGHE (PD) - Italy |
*---------------------------------------------------------*/
#include <stdio.h> /* Standard library */
#include <string.h>
#include <exec/types.h> /* Amiga specific */
#include <intuition/intuition.h>
#include <graphics/gfxbase.h>
#include <libraries/dos.h>
#include <libraries/reqbase.h>
#include <devices/printer.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include "mlo.h" /* Program specific */
#include "pf2.h"
#include "ext.h"
#include "aw.h"
static int Ask(char *pTitle, int nText, char *Text[]);
void SetupWB(void)
{
/**
| Printer setup, driven with requester windows when called from
| the Workbench.
**/
struct GetLongStruct GLS = {
NULL, 0, 0, 0, 0, NULL, REQVERSION, 0, 0
};
char cOri[] = "Orientation";
char *tOri[] = {
"Portrait",
"Landscape",
"\"Special\""
};
#define nOri (sizeof(tOri) / sizeof(char *))
char cFon[] = "Font";
char *tFon[] = {
"Courier",
"Letter-Gothic",
"Times"
};
#define nFon (sizeof(tFon) / sizeof(char *))
char cPit[] = "Horizontal pitch";
char *tPitC[] = {
"10 characters per inch",
"16.67 characters per inch",
"20 characters per inch"
};
char *tPitG[] = {
"12 characters per inch",
"24 characters per inch"
};
#define nPitC (sizeof(tPitC) / sizeof(char *))
#define nPitG (sizeof(tPitG) / sizeof(char *))
char cSty[] = "Style";
char *tSty[] = {
"Roman",
"Italic"
};
#define nSty (sizeof(tSty) / sizeof(char *))
char cHei[] = "Character height";
char *tHei[] = {
"12 points",
"6 points"
};
#define nHei (sizeof(tHei) / sizeof(char *))
char cQua[] = "Quality";
char *tQua[] = {
"Draft",
"Letter"
};
#define nQua (sizeof(tQua) / sizeof(char *))
char cSpa[] = "Vertical spacing";
char *tSpa[] = {
"6 lines per inch",
"8 lines per inch"
};
#define nSpa (sizeof(tSpa) / sizeof(char *))
/**
| Open required libraries
**/
GfxBase = LibOpen("graphics.library", REVISION);
ReqBase = LibOpen("req.library", 0);
r1:
switch (Ask(cOri, nOri, tOri)) {
case QUIT:
case CANCEL:
Cleanup(SYS_NORMAL_CODE);
case 1:
PageMode = SINGLE_PAGE;
Orientation = PORTRAIT;
r2: switch (Ask(cFon, nFon, tFon)) {
case QUIT:
Cleanup(SYS_NORMAL_CODE);
case CANCEL:
goto r1;
case 1:
Font = COURIER;
switch (Ask(cPit, nPitC, tPitC)) {
case QUIT:
Cleanup(SYS_NORMAL_CODE);
case CANCEL:
goto r2;
case 1:
Pitch = P10CPI;
break;
case 2:
Pitch = P16_67CPI;
break;
case 3:
Pitch = P20CPI;
break;
}
break;
case 2:
Font = GOTHIC;
switch (Ask(cPit, nPitG, tPitG)) {
case QUIT:
Cleanup(SYS_NORMAL_CODE);
case CANCEL:
goto r2;
case 1:
Pitch = P12CPI;
break;
case 2:
Pitch = P24CPI;
}
break;
case 3:
Font = TIMES;
Pitch = PROPORTIONAL;
break;
}
if (Font == COURIER && Pitch == P16_67CPI) {
Style = ROMAN;
} else {
switch (Ask(cSty, nSty, tSty)) {
case QUIT:
Cleanup(SYS_NORMAL_CODE);
case CANCEL:
goto r2;
case 1:
Style = ROMAN;
break;
case 2:
Style = ITALIC;
break;
}
}
break;
case 2:
r2l: Orientation = LANDSCAPE;
PageMode = SINGLE_PAGE;
Font = COURIER;
switch (Ask(cPit, nPitC, tPitC)) {
case QUIT:
Cleanup(SYS_NORMAL_CODE);
case CANCEL:
goto r1;
case 1:
Pitch = P10CPI;
break;
case 2:
Pitch = P16_67CPI;
break;
case 3:
Pitch = P20CPI;
break;
}
break;
case 3:
PageMode = LEFT_PAGE;
goto r5;
}
r3:
switch (Ask(cHei, nHei, tHei)) {
case QUIT:
Cleanup(SYS_NORMAL_CODE);
case CANCEL:
if (Orientation == PORTRAIT) goto r2;
else goto r2l;
case 1:
Height = 12;
break;
case 2:
Height = 6;
break;
}
r4:
switch (Ask(cSpa, nSpa, tSpa)) {
case QUIT:
Cleanup(SYS_NORMAL_CODE);
case CANCEL:
goto r3;
case 1:
Lpi = 6;
break;
case 2:
Lpi = 8;
break;
}
r5:
switch (Ask(cQua, nQua, tQua)) {
case QUIT:
Cleanup(SYS_NORMAL_CODE);
case CANCEL:
if (PageMode == LEFT_PAGE) goto r1;
else goto r4;
case 1:
Quality = DRAFT_Q;
break;
case 2:
Quality = LETTER_Q;
break;
}
windowOff();
if (PageMode == LEFT_PAGE) goto r7;
r6:
GLS.titlebar = "Leading blanks:";
GLS.defaultval = 0;
GLS.minlimit = 0;
GLS.maxlimit = 40;
if (GetLong(&GLS)) {
nBlanks = GLS.result;
if (nBlanks) {
Buffer = inBuffer + nBlanks;
memset(inBuffer, BLANK, nBlanks);
}
} else {
goto r5;
}
r7:
GLS.titlebar = "TAB expansion:";
GLS.defaultval = 8;
GLS.minlimit = 2;
GLS.maxlimit = 20;
if (GetLong(&GLS)) {
nTabs = GLS.result;
} else {
if (PageMode == LEFT_PAGE) goto r5;
else goto r6;
}
if (PageMode == LEFT_PAGE) SetSpecialMode();
}
void windowOff(void)
{
struct Message *pIM;
if (Wind != NULL) {
while ((pIM = GetMsg(Wind->UserPort)) != NULL) ReplyMsg(pIM);
CloseWindow(Wind);
Wind = NULL;
}
}
void *LibOpen(
char *Name, /* Library name */
long Rev /* Revision level (or 0) */
){
/**
| Open required library
**/
void *p;
p = OpenLibrary(Name, Rev);
if (p == NULL) Cleanup(SYS_ABORT_CODE);
return p;
}
static int Ask(
char *pTitle, /* General title */
int nText, /* Number of choices */
char *cText[] /* Description */
){
/**
| This routine displays a "cycle gadget" (an array of nText choices
| described by cText[]): i.e. a window where the general title and the
| current choice are displayed, together with a forward- and a backward-
| cycling gadget, and the 3 fixed gadgets "OK", "QUIT" and "CANCEL".
| The return value is either CANCEL (0), or QUIT (-1), or, if OK was
| selected, a number in the range 1..nText identifying the currently
| selected cycle-gadget choice. The window size should be enough to
| display the pTitle and cText strings.
**/
int x; /* X coordinate, current string */
int n; /* Number of characters, cur. string */
int newx, newn, newcurrent;
int current = 0; /* Current cycle gadget choice */
struct IntuiMessage *pIM; /* Intuition message */
ULONG MClass; /* Message type */
struct RastPort *pRP; /* Requester window raster port */
struct Gadget *pG; /* Selected gadget */
/**
| Ask() uses the same window for all our cycle gadgets; the first
| time, it has to be opened (will be closed calling windowOff()).
**/
if (Wind == NULL) {
sprintf(title, "PF2 v%.2f - MLO %d ", VERSION, LAST_CHANGE);
if ( (Wind = OpenWindow(&NWind)) == NULL) {
Cleanup(SYS_ABORT_CODE);
}
realWidth = Wind->Width - Wind->BorderRight;
realHeight = Wind->Height - Wind->BorderBottom;
}
/**
| Clear the window, and display the general title and the first
| cycle-gadget choice.
**/
SetAPen((pRP = Wind->RPort), BLACK_PEN);
RectFill(pRP, Wind->BorderLeft, Wind->BorderTop,
realWidth, realHeight);
RefreshGadgets(askGad, Wind, NULL);
SetAPen(pRP, RED_PEN);
SetBPen(pRP, BLACK_PEN);
x = (realWidth - TextLength(pRP, pTitle, (n = strlen(pTitle)))) / 2;
Move(pRP, x, AW_YTITLE);
(void) Text(pRP, pTitle, n);
x = (realWidth - TextLength(pRP, cText[0], (n = strlen(cText[0])))) / 2;
SetAPen(pRP, WHITE_PEN);
Move(pRP, x, AW_YCYCLE);
(void) Text(pRP, cText[0], n);
/**
| Now, wait for gadget hits and perform the appropriate action.
| Exit when either OK or CANCEL or QUIT has been hit.
**/
FOREVER {
(void) Wait(1L << Wind->UserPort->mp_SigBit);
while ((pIM = (struct IntuiMessage *)
GetMsg(Wind->UserPort)) != NULL) {
MClass = pIM->Class;
pG = (struct Gadget *) pIM->IAddress;
ReplyMsg((struct Message *) pIM);
switch (MClass) {
case GADGETUP:
switch (pG->GadgetID) {
case AW_CANCEL:
return CANCEL;
case AW_QUIT:
return QUIT;
case AW_OK:
return ++current;
case AW_FORWARD:
newcurrent = current + 1;
if (newcurrent >= nText) {
newcurrent = 0;
}
newx = (realWidth - TextLength(pRP, cText[newcurrent],
(newn = strlen(cText[newcurrent])))) / 2;
break;
case AW_BACKWARD:
newcurrent = current - 1;
if (newcurrent < 0) newcurrent = nText - 1;
newx = (realWidth - TextLength(pRP, cText[newcurrent],
(newn = strlen(cText[newcurrent])))) / 2;
break;
}
SetAPen(pRP, BLACK_PEN);
Move(pRP, x, AW_YCYCLE);
(void) Text(pRP, cText[current], n);
SetAPen(pRP, WHITE_PEN);
current = newcurrent;
x = newx;
n = newn;
Move(pRP, x, AW_YCYCLE);
(void) Text(pRP, cText[current], n);
}
}
}
}